package com.base.storage.service;

import com.base.core.lang.StringUtils;
import com.base.core.utils.UUIdUtils;
import com.base.storage.config.CloudStorageConfig;
import org.apache.tools.ant.util.DateUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;
import java.util.Arrays;
import java.util.Date;

/**
 * 云存储(支持七牛、阿里云、腾讯云、又拍云)
 *
 * @author lipengjun
 * @email 939961241@qq.com
 * @date 2017-03-25 14:58
 */
public abstract class CloudStorageService {

    protected CloudStorageConfig config;

    public CloudStorageService(CloudStorageConfig cloudStorageConfig) {
        this.config = cloudStorageConfig;
    }

    protected CloudStorageConfig getConfig() {
        return config;
    }

    protected void setConfig(CloudStorageConfig config) {
        this.config = config;
    }

    /**
     * 文件路径
     *
     * @param prefix 前缀
     * @return 返回上传路径
     */
    public String getPath(String prefix) {
        //生成uuid
        String uuid = UUIdUtils.fastSimpleUUID();
        //文件路径
        String path = DateUtils.format(new Date(), "yyyyMMdd") + "/" +
                    DateUtils.format(new Date(), "HHmmssS") + uuid.substring(0, 5);

        if (StringUtils.isNotBlank(prefix)) {
            path = prefix + "/" + path;
        }

        return path;
    }

    /**
     * 文件路径
     *
     * @param prefix 前缀
     * @param filename 自定义文件名
     * @return 返回上传路径
     */
    public String getPath(String prefix, String filename) {
        //文件路径
        String path =  filename;
        if (StringUtils.isNotBlank(prefix)) {
            path = prefix + "/" + filename;
        }
        return path;
    }

    /**
     * 文件上传
     *
     * @param file 文件
     * @return 返回http地址
     */
    public abstract String upload(MultipartFile file) throws Exception;

    /**
     * 文件上传
     *
     * @param base64
     * @return 返回http地址
     */
    public abstract String upload(String base64);

    public abstract String upload(String base64, String filename);

    /**
     * 检查文件大小
     *
     * @param multipartFile
     * @return
     */
    protected boolean checkSize(MultipartFile multipartFile) {
        //文件大小判断
        return multipartFile.getSize() > 0 && multipartFile.getSize() <= CloudStorageConfig.FILE_MAX_SIZE;
    }

    /**
     * 检查文件类型
     *
     * @param multipartFile
     * @return
     */
    protected boolean checkType(MultipartFile multipartFile) {
        if(config.getWhitelist().length <= 0){
            //如果未设置，不检测白名单
            return true;
        }
        //文件类型
        String fileType = multipartFile.getContentType();
        // 白名单匹配
        return Arrays.stream(config.getWhitelist()).anyMatch(x -> x.equalsIgnoreCase(fileType));
    }


    /**
     * 文件上传
     *
     * @param inputStream 字节流
     * @param fileType  文件mime类型
     * @param path        文件路径，包含文件名
     * @return 返回http地址
     */
    protected abstract String upload(InputStream inputStream, String fileType, String path);

    /**
     * 通过文件名下载文件
     *
     * @param fileName      要下载的文件名
     *                      例如：4DB049D0604047989183CB68D76E969D.jpg
     * @param localFileName 本地要创建的文件名
     *                      例如：C:\Users\Administrator\Desktop\test.jpg
     */
    public abstract void downloadFile(String fileName, String localFileName);

    /**
     * @param fileUrl 需要删除的文件url
     * @return boolean 是否删除成功
     * @MethodName: deleteFile
     * @Description: 单文件删除
     * 例如：http://*.oss-cn-beijing.aliyuncs.com/4DB049D0604047989183CB68D76E969D.jpg
     */
    public abstract boolean deleteFile(String fileUrl);

}
